home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ABUSESRC.ZIP / AbuseSrc / imlib / targa.c < prev    next >
C/C++ Source or Header  |  1996-05-17  |  2KB  |  124 lines

  1. #include "image.hpp"
  2. #include "specs.hpp"
  3.  
  4. image *load_targa(char *filename, palette *pal)
  5. {
  6.   bFILE *fp=open_file(filename,"rb");
  7.   if (!fp)
  8.     return 0;
  9.  
  10.   if (fp->open_failure())
  11.   {
  12.     delete fp;
  13.     return 0;
  14.   }
  15.   
  16.   unsigned char id,color_map,im_type;
  17.  
  18.   id=fp->read_byte();
  19.   color_map=fp->read_byte();
  20.   im_type=fp->read_byte();
  21.  
  22.   if (color_map!=0)
  23.   {
  24.     delete fp;
  25.     return 0;
  26.   }
  27.  
  28.   if (!(im_type==2 || im_type==10))
  29.   {
  30.     delete fp;
  31.     return 0;
  32.   }
  33.  
  34.   fp->read_short();
  35.   fp->read_short();
  36.   fp->read_byte();
  37.  
  38.   fp->read_short();
  39.   fp->read_short();
  40.  
  41.  
  42.   int w=fp->read_short();
  43.   int h=fp->read_short();
  44.   unsigned char bpp=fp->read_byte();
  45.   unsigned char im_des=fp->read_byte();
  46.  
  47.   if (bpp!=32)
  48.   {
  49.     delete fp;
  50.     return 0;
  51.   }
  52.  
  53.   image *im=new image(w,h);
  54.  
  55.   int x,y;
  56.   unsigned char ctrl;
  57.   unsigned char bgra[4],*sl,c,lr,lg,lb,ll=0,lc;
  58.   
  59.   
  60.   
  61.  
  62.   if (im_type==10)
  63.   {    
  64.     for (y=0;y<h;y++)
  65.     {
  66.       sl=im->scan_line(h-y-1);
  67.  
  68.       for (x=0;x<w;)
  69.       {
  70.         ctrl=fp->read_byte();
  71.         if (ctrl&0x80)
  72.         {
  73.           fp->read(bgra,4);
  74.           ctrl&=(~0x80);
  75.           ctrl++;
  76.           if (bgra[3])
  77.           {
  78.             if (ll && lr==bgra[2] && lg==bgra[1] && lb==bgra[0])
  79.               c=lc;
  80.             else
  81.             {
  82.               c=pal->find_closest_non0(bgra[2],bgra[1],bgra[0]);
  83.               lr=bgra[2];
  84.               lg=bgra[1];
  85.               lb=bgra[0];
  86.               lc=c;
  87.               ll=1;
  88.             }
  89.  
  90.           }
  91.           else c=0;
  92.  
  93.           while (ctrl--)
  94.           {
  95.             *sl=c;
  96.             sl++;
  97.             x++;
  98.           }
  99.         } else
  100.         {
  101.           ctrl++;          
  102.           while (ctrl--)
  103.           {
  104.             fp->read(bgra,4);
  105.             if (bgra[3])
  106.             {
  107.               c=pal->find_closest_non0(bgra[2],bgra[1],bgra[0]);
  108.             }
  109.             else c=0;
  110.             *sl=c;
  111.             sl++;
  112.             x++;
  113.           }
  114.         }
  115.       }
  116.     }    
  117.   }
  118.  
  119.  
  120.  
  121.   delete fp;
  122.   return im;
  123. }
  124.